People are confused by ApplicationContext in Windows Forms, but there really isn't any magic happening.
Everyone knows the standard syntax Application.Run to get the message pump started and have your forms display. What most people don't know is how the whole process works and how to get multiple forms up and running. To get some background on you can check out this newsgroup posting where users are trying to help one another through the process, but just aren't certain about how things work http://groups.google.com/groups?selm=MPG.1a75e03c74670c38989868%40msnews.microsoft.com&oe=UTF-8.
The Application class allows you to run a message loop in three ways. You can pass nothing, in which case the Run method will block all day long. You can pass a Form, in which case the Form.Closed event is hooked and the application exits. Or you can pass in an ApplicationContext. We'll get to this last one later. For most purposes people are going to find Application.Run(Form) to be the overload of choice. So how can you use Application.Run(Form), but show another form? Well, you can Show/Hide forms all day long and your thread won't exit out. So having your main form, show sub-forms is quite easy. What happens when your main form gets closed though? Well, you can't let that happen using this overload. You'll have to attach an event handler to your Closing event and return true to CancelEventArgs.Cancel.
Your other option is to just Show your first form, THEN call Application.Run with an empty constructor. Your Form will run, but when it closes, your application won't exit. The problem here is you won't be able to run any more code either. So you have to be careful with this method. You need to make sure there is a Form open at all times so you get to run code. In the case of a wizard or a series of forms, you'd simply make sure that as one form is closing, you are opening the next form in the range. When the last form closes you need to call Application.ExitThread and your application will shut down.
Need another option? Application has an Idle event. You can hook this event to make sure you can always run more code even if there aren't any active forms. That way if the user shuts you down you can re-open your form. You'll still need to call Application.ExitThread in order to shut the application down, but this way you have some security since you can always shut down the application from within the Idle even if you detect the lack of open forms.
Need another option? You can throw a timer into the mix as well. This can even be a WinForms timer, since a timer is hooked to a message pump and the Application is a message pump, you can still get timer messages even if forms aren't open. Again, another place to load up forms if the user closes them all, or shut your application down.
Now we are ready for the ApplicationContext. The ApplicationContext is best used for things like my wizard framework where the component itself knows how to shut things down, but the component isn't a Form. Creating timers and hooking idle are global ways of handling things, while the ApplicationContext is more modular and object oriented. For purposes of stringing Forms together, I would recommend that your ApplicatonContext not even bother setting the MainForm property, rather I'd make sure to hook the Closing or Closed events of all my forms to make sure that I'm always executing code. You can still trap the Application.Idle event from within your ApplicationContext as well and use that.
Now for the kicker. Application.Run is nothing but a blocking call to a message pump. It is NOT the end of the world. It is NOT the end of your application. You can call Application.Run(Form) wait for it to exit, then call Application.Run(Form2) with the next form if your wanted. That is yet another way to handle the whole process of displaying multiple forms and still use the default message pump.
Are there any design guidelines for this type of thing? I don't know of any, but maybe I can get someone from the Windows Forms team to comment. Until then enjoy playing with all of the options here that basically do the same thing ;-)