Das sind so genannte Generics. Darunter verstehet man das etwas mehrere Datentypen annehmen kannn.
Im Beispiel deiner "List"-Klasse ist es selbiger egal welchen Datentyp sie verwalten soll aber du als Programmierer möchtest natürlich Typensicherheit haben.
"List<int>" steht also auf deutsch für "List für Int-Datentypen". In eine solche Liste kannst du nun nur Integers speichern.
Ohne Generics müßte man für jeden Datentyp eine eigene List-Klasse implementieren. ZumBeispiel: "new IntListe()", "new DoubleListe" und so weiter.
Der allegemine Beschreibungssyntax dafür lautet
List<T>
und bedeutete Liste vom Typ "T" wobei T der Platzhalter für den hier einzusetzten Datentyp ist.
Ein Beispiel:
public class List<T>{ void Add(T input) { } }
An allen stellen wo "T" als Datentyp-Angabe verwendet wird, wird dieser zur Laufzeit ersetzt (Stichwort "Template"). Im Fall von "List<int>" sieht das ganze dann so aus: