What happens with
form.Show();
is that this causes the form to display on a separate thread. So what happens in your Main() is that the form is opened, only ever so briefly, then the code keeps executing until the end of main. So this causes the main thread to finish and disposing of any other items. If you like to block the main thread with the form, use
form.ShowDialog();
instead, this blocks the main thread from continuing the process and returns back whenever you close/ dispose of the form.
This can also be done:
static Main(string[] args){
MyForm form = new MyForm(args);
Application.Run(form);
}