Ну, это потому, что имя типа в .NET на самом деле IS List'1. «1» - это так называемая арность обобщенного типа, и она сообщает, сколько существует параметров типа.
Это необходимо для того, чтобы вы могли создать более 1 универсального типа с тем же «именем», но с другим числом параметров универсального типа.
Например, существует более 1 типа, называемого System.Action. Настоящие имена - System.Action'1, System.Action'2, System.Action'3 и т. Д.
Итак, если вы знаете, что ваш тип является общим, вы можете предположить, что в конце имени стоит этот 'XX, так что вы можете просто вырезать эту часть, например, так:
string strTypeName = typeof(List<>).Name.Substring(0, typeof(List<>).Name.LastIndexOf("`"));
PS: Пожалуйста, замените 'на `.