Ciao,
purtroppo non credo che per il tuo caso un comparer possa risolvere il problema. Il valore 0, infatti, non indica "non spostare", ma semplicemente che i due dati verificati sono uguali; questo, applicato all'algoritmo QuickSort che internamente il framework usa per eseguire l'ordinamento provoca l'errato risultato che ottieni.
Nota anche che per la particolare natura del quicksort, non solo i valori null vengono spostati, ma addirittura il tuo ragionamento provoca anche un errore sul confronto dei dati non nulli.
Secondo me non è banale scrivere un comparer che si comporti come dici applicato ad una lista di nodi. Magari mi sbaglio, ma alle 10.57 di mattina non mi viene in mente granché

Fossi in te, per non saper né leggere né scrivere, risolverei la cosa in maniera algoritmica, ossia
1) rimuovendo i nodi nulli (e salvando il relativo indice)
2) ordinando la lista di dati non nulli
3) reinserendo i nodi nulli
Puoi fare anche un ExtensionMethod che realizzi questa logica, magari corredato da 2-3 unit test che ne verifichino la correttezza.
Ciao,
m.