You need to emit symbolic information in order to be able to debug the IL.
Emitting Symbolic Information with Reflection Emit
and match the emitted opcodes with the coresponding location in your file that emits it.(Where ILGenerator.Emit() call is).
But this is certainly not a trivial task.
Edit:
you can't debug code that is not verifiable, it doesn't get Jit-ed at all. You need to check your correct usage of IL ops. does every of have in the stack the proper operands of the required type which it expects?
Edit 2:
And easy way to do it is to create the code using C# then use Reflector or some other IL disassembler too see the IL and compare it to yours.
Edit 3: Unfortunately debug info can't be emitted using DynamicMethod, but WinDBG can be used to dump the IL, Jose Fco Bonnin explains it in his blog. Executing dynamic IL with DynamicMethod:
The main problem we experience with
DynamicMethod is that we do not have
the ability to generate debugging info
for LCG, since the debugging API is
based on metadata that the LCG does
not have. In any case, not all is lost
since we can continue debugging with
WinDBG. ...
the process is explained further in the post.