Salve Pit77, ho avuto anch’io un problema simile, secondo me la chiamata a ShowDialog l’hai fatta in maniera sbagliata, come ho fatto io puoi avere un controllo maggiore del perché il Form2 è stato chiuso.
Ti posto una parte del codice di Form1
private void btnPesa_Click(object sender, EventArgs e) {
    //…
    frmPesaInfo frm2 = new frmPesaInfo(ntC);
    DialogResult dRes = frm2.ShowDialog();
    switch (dRes) {
        case DialogResult.Cancel:
        case DialogResult.Ignore:
            break;
        case DialogResult.Abort:
            this.puoPesare = false;
            break;
        case DialogResult.Retry:
            ntC = frm2.NoteColl;
            this.isDirty = true;
            break;
        default:
            MessageBox.Show(dRes.ToString());
            break;
    }
    //…
}
Come vedi il mio frmPesaInfo corrisponderebbe al tuo frmListaIngredienti (Form2), ma nel mio caso Form1 passa l’oggetto ntC (è una specie di List) a frmPesaInfo ed una volta corretti i dati, li ripassa a Form1. Gli ho creato un altro costruttore apposito (ovviamente che chiama quello senza parametri per la questione di InitializeComponent). NoteColl dovrebbe corrispondere alla tua sIngredienti, però per la fretta e per semplicità l’ho lasciata public.
Ovviamente frmPesaInfo è un complesso MessageBox con i 3 pulsanti
private void btnAggiorna_Click(object sender, EventArgs e) {
    // …
    this.DialogResult = DialogResult.Retry;//come ultima istruzione: chiude il form col relativo motivo
}
private void btnSalta_Click(object sender, EventArgs e) {
    // …
    this.DialogResult = DialogResult.Ignore;
}
private void btnStop_Click(object sender, EventArgs e) {
    // …
    this.DialogResult = DialogResult.Abort;
}
Beh, puoi benissimo gestirtelo in un’altra maniera, il mio caso può essere diverso dal tuo!