Puedes hacer lo siguiente:
Te recomiendo que dentro del Form1 utilizes un descriptor de acceso del tipo bool al momento de pedir el Login de la siguiente manera: declara una variable del tipo booleano en la parte inicial de la clase Form1 para que se conozca dentro de dicha forma o clase:
private bool blLoginCorrecto = false;
en la parte en donde validas que el login es el correcto, establece la variable anterior en true:
blLoginCorrecto = true;
Luego, en una parte dentro de Form1 ya declaras el descriptor:
public bool LoginCorrecto
{
get
{
return this.blLoginCorrecto;
}
}
Por último en el método main() quedaría así:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form1 = new Form1();
Application.Run(form1);
if (form1.LoginCorrecto)
Application.Run(new Form2());
}
Bueno esta es la sugerencia que te hago, nada más como cometario, tu aplicación se cerraba a lo mejor por que mandabas llamar a Form2 dentro de Form1 y luego la cerrabas, después de hacer el cierre de Form1, la aplicación lo que hace es seguir la ejecución del código dentro del Main pero como ya no encontraba ninguna instrucción después de 'Application.Run(new Form1());', entonces ya terminaba la aplicación.
Saludos.