Quickstart guide for OpenTK:

1. Download OpenTK from http://www.opentk.com
2. Install OpenTK to a random folder, e.g. c:\OpenTK\1.1
3. Create a new C# console project in Visual Studio
4. Add two references:
   - OpenTK.dll (from OpenTK\1.1\Binaries\OpenTK\Release)
   - System.Drawing
5. Paste the code below and run it
6. Read some documentation at http://www.opentk.com/doc
7. Read some advice below the code snippet.

using System;
using System.Drawing;
using System.Drawing.Imaging;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
 
namespace Example
{
	public class OpenTKApp : GameWindow
	{
		protected override void OnLoad( EventArgs e )
		{
			GL.ClearColor( Color.MidnightBlue );
			Width = 800;
			Height = 480;
		}
		protected override void OnUnload(EventArgs e)
		{
		}
		protected override void OnResize(EventArgs e)
		{
			GL.Viewport(0, 0, Width, Height);
			GL.MatrixMode( MatrixMode.Projection );
			GL.LoadIdentity();
			GL.Ortho( -1.0, 1.0, -1.0, 1.0, 0.0, 4.0 );
		}
		protected override void OnUpdateFrame(FrameEventArgs e)
		{
			var keyboard = OpenTK.Input.Keyboard.GetState();
			if (keyboard[OpenTK.Input.Key.Escape]) this.Exit();
		}
		protected override void OnRenderFrame(FrameEventArgs e)
		{
			GL.Clear( ClearBufferMask.ColorBufferBit );
			GL.MatrixMode( MatrixMode.Modelview );
			GL.LoadIdentity();
			GL.Begin( PrimitiveType.Quads );
			GL.Color3( Color.Red );
			GL.Vertex2( -0.6f, -0.4f );
			GL.Vertex2(  0.6f, -0.4f );
			GL.Vertex2(  0.6f,  0.4f );
			GL.Vertex2( -0.6f,  0.4f );
			GL.End();
			SwapBuffers();
		}
		[STAThread]
		public static void Main()
		{
			using (OpenTKApp app = new OpenTKApp())
			{
				app.Run(30.0, 0.0);
			}
		}
	}
}

From 'avoiding pitfalls in the managed world',
http://www.opentk.com/doc/chapter/2/rules_of_thumb

For optimal math performance, use ref and out:

Vector3 v1 = Vector3.UnitX;
Vector3 v2 = Vector3.UnitZ;
Vector3 v3 = Vector3.Zero;
v3 = v1 + v2;                        // requires three copies; slow.
Vector3.Add(ref v1, ref v2, out v3); // nothing is copied; fast!

This is because Vector3, Matrix4 etc. are structs, not classes,
and will be passed by value by default. Same goes for calling OpenGL
functions:

GL.Vertex3(ref v1.X);  // pass a pointer to v1; fast!
GL.Vertex3(v1);        // copy the whole v1 structure; slower!

Use the .NET2.0 Stopwatch class to measure performance:

Stopwatch sw = new Stopwatch();
sw.Start();
// Your code goes here.
sw.Stop();
double ms = sw.Elapsed.TotalMilliseconds;