I'm over the moon. I was missing a call to GL.Viewport() to set the full screen bounds exactly as you said. And it was rendering all red because I wasn't clearing the texture GL.BindTexture(TextureTarget.Texture2D, 0) before re-drawing it - I'm a fool.

But it's all working now:

Standard:


Stretched FBO:


Thanks for the other notes and my incorrect GL.PushMatrix() GL.PopMatrix() usage.

You mention shaders and not using the fixed pipeline. If you have any links to resources which show how I could achieve this with shaders I'd like to have a look. I take it this fixed pipeline approach is non-standard?

Thanks for all your guidance.