Back when I was first learning .NET, I was always wondering why there wasn’t an IL debugger. It wasn’t until I had really seen the guts of .NET executing that I realized that an IL debugger wouldn’t be particularly useful for real world debugging. The IL is just a model. It doesn’t really execute. Sure, you could build a simulator for the .NET “virtual machine”, and see the effects of stepping through IL, but the simulation would likely have significant differences from the native code that actually executes.
Mike Stall’s blog (highly recommended) has an overview of “IL debugging” that I wish I’d written.