Manchmal macht es einem Microsoft echt leicht. Anstatt mit WaitForSingleObject rumhantieren zu müssen, muss man nur WaitForExit() des Prozesses aufrufen!
Lösung:
Code:
System.Diagostics.Process p = System.Diagnostics.Process.Start("calc.exe");
Console.WriteLine("Calc gestartet!");
p.WaitForExit();
Console.WriteLine("Calc beendet!");