Ho provato e ha funzionato.

Allora, il mio problema era far partire una form Toppa la quale, al termine del suo ciclo vitale, mi doveva restituire dei dati utili per la prosecuzione della form principale.

L'idea era creare questa Toppa che poi potevo implementare in diversi progetti con il minimo lavoro di riadattamento possibile.

Se la mia applicazione viene avviata con dei parametri passati a riga di comando parte normalmente e tira invettive se i parametri sono sbagliati.

Se invece viene aperta senza parametri (classico doppio click) allora cerca di aiutare l'utente a crearli questi parametri.

In poche parole chiedo i parametri di accesso al DB.

Nel braccetto della Main che apro se args.Length==0 per prima cosa costruisco l'oggetto senza usare l'Application.Run, ma usando lo ShowDialog

codice:
Toppa to=new Toppa();
to.ShowDialog();
All'interno di Toppa ho creato un metodo pubblico GetArgs che restituisce un array contenente i parametri che sono stati generati all'interno di Toppa.
L'array avrà le stesse informazioni che conterrebbe normalmente l'args del Main.

Cliccando sul pulsante Ok di Toppa (che farà tutti i vari controlli del caso) istanzio l'array (che sarà globale nella classe) e chiudo l'applicazione.

Se Ok da errori o se chiudo male Toppa (con la x o con annulla) l'array sarà null.

A questo punto il puntatore torna al Main, l'oggetto to ancora è attivo quindi posso recuperare l'array e infine disfarmi di Toppa:
codice:
string [] args2 = to.GetArgs();
to.Dispose();
Si chiama args2 perché args già esiste nel Main.
Se args2 non è null allora posso far partire pure l'applicazione main con Application.Run(new Principale(args2));

Sono proprio soddisfatto del risultato, grazie ancora per l'aiuto