Your implementation suffers of over-engineering and is pretty rigid in terms of extensibility. **Legacy** - are there really that many platforms still under OGL < 1.5 ? - if you have such case, does it even support C# ? - IMO you should have a `LegacyRenderer` (immediate) and a `ModernRenderer`, don't mix them **Implementation** - your system only supports one type of vertex declaration : position, color, UV - nowhere you are letting the user specify its custom declaration - nowhere you are letting the user specify a shader - the binding of vertex attributes have fixed positions I would suggest to take a look at the following library I wrote a while ago, it does mimic what XNA does in the sense that you get VBOs, VAOs, Effects classes; and these are untied to any specific vertex declaration as you did. **Repository / usage example:** https://github.com/aybe/GLA https://github.com/aybe/GLA/blob/master/GLADemo/GameDemoGLA.cs#L125 (you will see 3 examples: lines, triangles, textures) **Dynamic assignment of vertex attributes according user declaration:** https://github.com/aybe/GLA/blob/master/GLA/VertexArray.cs https://github.com/aybe/GLA/blob/master/GLA/VertexDeclaration.cs https://github.com/aybe/GLA/blob/master/GLA/VertexElement.cs https://github.com/aybe/GLA/blob/master/GLA/VertexElementFormat.cs https://github.com/aybe/GLA/blob/master/GLA/VertexElementUsage.cs I designed that library by **reverse-engineering XNA** using a decompiler such as DotPeek. **Also, another great source of inspiration to you could be the MonoGame project:** https://github.com/mono/MonoGame/tree/develop/MonoGame.Framework/Graphics/Vertices Last thing, spending a few days in using XNA or MonoGame would certainly help you get a better picture of what's a good API and how you should design yours consequently :D