Edit: I’ve read up a bit about the ‘switch and bait’ pattern that was used to distribute MonoGame.Portable (quite a clever use of NuGet). Anyway, it seems there is no way around of having to create a .csproj per platform.
This is a theoretical question.
Let’s say there MonoGame provided a portable version of its dll (PCL). It has both Direct3D and OpenGL compiled shader bytecode embedded into the assembly How would it determine which version of this shader code to load? How would it know whether a project consuming the assembly is targeting a Direct3D or OpenGL platform?
Currently the shader loading decision is made based on preprocessor directives, which means that when MonoGame is compiled, it will contain different code based on target platform. This obviously wouldn’t work for a portable version since the target platform would not be known at compile time.