You can't dispose the main form because that's what the message pump (which Application.Run starts) waits for. If you dispose the main form, you effectively let the message pump know that it can quit and your entry point returns. When the entry point returns, the CLR unloads your application (if there are no running background threads). See Charlie's response for a good solution (no need to repeat it). Also, you might consider a wizard-like interface, even if it has no "Back" or "Previous" button. You load one Form which adds and removes instances of container classes (like the Panel) onto its surface. This is how property sheets and wizards (which actually use the same interfaces and functions) work in Windows Explorer and other applications that use the shell-provided property sheet implementation.
Microsoft MVP, Visual C# My Articles