If you don't mind having to recompile the application every time you need to debug, you can throw in a temporary call to System.Diagnostics.Debugger.Break() on startup. This will invoke the just in time debugging dialog and allow you to attach at the point that Debugger.Break() is called.
You can also enable JIT debugging for an exe with a given name using a tool called "Global Flags" / gflags. With this option, there is no need to modify the source or recompile.
Download the debugging tools for windows from here:
http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx
Run gflags.exe in C:\Program Files\Debugging Tools for Windows\gflags.exe
Select the image file tab
Enter the name of your exe, e.g. myapplication.exe at the top and press tab
Select Debugger near the bottom and enter vsjitdebugger.exe
As long as this flag is set, you will be prompted to debug the application whenever it starts.
Yet another option is to add a command line switch to your application and batch file (e.g. /break) and only call Debugger.Break() when it is passed. This avoids the need to recompile when you decide to debug, and also eliminates the hassle of having to check off the debugger option in gflags every time.
The obvious advantages of these approaches is that they eliminate any kind of race between when the application starts and when you can attach.