Jo da gibt es schon noch das ein oder andere Verständnisproblem 😉
Würde dir dringend die "C# coding conventions" empfehlen. Wenigstens grob, damit du bei der Namensgebung nicht unnötigerweise alles anders machst als der Rest der Welt.
Was du class spsliste nennst, hält so wie du es implementiert hast die Einträge einer Zeile aus der Datenbank. Es ist keine Liste, sondern eines von vielen Elementen einer Liste. Der Name ist irreführend.
Das solltest du SpsItem (oder so, jedenfalls Einzahl) nennen.
static spsliste SPSliste = new spsliste(); erstellt ein einziges Objekt dieser Klasse. Es heißt als wäre es eine Liste, ist aber keine.
In dieses eine Objekt schreibst du der Reihe nach die aus der Datenbank gelesenen Zeilen. Nach dem while stehen die Daten der letzten Zeile drin, der Rest ist weg.
Was nu?
List<> ist eine Liste, die mehrere Elemente aufnehmen kann.
Wenn das die Mehrzahl im Namen hat, sieht man auch dass es um mehrere Elemente geht.
Pro Rückgabezeile aus der Datenbank erstellst du dann ein neues SpsItem, weist dem die Daten so zu wie du es schon gemacht hast und dann hängst du das mit Add() an die Liste.
Etwa so (ungetestet)
List<SpsItem> spsItems = new List<SpsItem>();
while ... {
SpsItem item = new SpsItem();
item.spsname = ...
weitere Felder
spsItems.Add(item);
}