Как сделать так чтобы при закрытие формы основная форма не закрывалось?
если освоили только дизайнер форм - ни как. что бы понять почему, и в какую сторону копать - изучите повнимательнее код запускаемого модуля. обычно он в файле Program.cs
там будет что то вродеusing System;
using System.Windows.Forms;

namespace my_namespace
{
    internal static partial class my_program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new my_main_form());
        }
    }
}
как только вы поймете, куда переходит управление после закрытия экземляра my_main_form(), будет проще искать или придумывать решения для ваших хотелок.

простейший ломовой подход - настоящая главная форма пустая и скрытая. при старте создает какую то из дочерних форм и отслеживает сколько форм открыто. реально закрывается, допустим, когда закрыты все дочерние формы.

а вообще можно до одури чего придумать. переопределять обработку крестиков закрывающих формы. и даже изменить алгоритмистику головного модуля.
Я так понял это WinForms? Как вариант на событие закрытия главной формы повесить обрабтчик который будет отслеживать открыта ли вторая форма, если открыта, то он будет скрывать окно. Ну и на событие закрытия второй формы отслеживать если первое окно скрыто, то закрыть и его чтобы завершилась программа.
Еще один такой себе вариант, на открытие нового окна создаем новый поток и запускаем его, в нем открываем окно через showdialog, но оно откроется как отдельное окно не зависимое от первого и в тоже время засинхронит поток, тоесть пока оно не закроется поток не завершится, а пока поток не завершиться и программа не завершиться. Типа такого
Thread t = new Thread(new ParameterizedThreadStart((o) =>
            {
             Form   form = new Form2();
                form.ShowDialog();
            }));
            t.Start();