Per ricavare l'altezza più grande sotto alla soglia ti conviene utilizzare ancora LINQ per una maggiore leggibilità:
int altezza1 = (from p in casse
where p.Altezza < int.Parse(Altezza.Text)
orderby p.Altezza descending
select p.Altezza).FirstOrDefault();
la query associata alla variabile "prova" del codice che avevi postato a questo punto non ti serve e la puoi cancellare
Trovo il codice più pulito con una classe non anonima
Ciao
PS: Nel codice di prima togli da "NumSerbatoio.Text" le virgolette naturalmente