Olá, Wendel
Entendo sua confusão, mas acho que posso ajudar a esclarecer. O código que você está olhando é um exemplo de um método genérico. Em C#, quando vemos <T>, isso não significa que T é uma string ou um int, mas sim que T é um tipo genérico. Isso significa que T pode ser qualquer tipo.
No seu exemplo, o método AdicionarVarios<T> está sendo definido para operar em uma List<T>, onde T é qualquer tipo. Quando você chama esse método, você especifica o tipo que T deve ser. Então, se você tem uma List<string>, você pode chamar AdicionarVarios<string> e passar um array de strings como argumento. Da mesma forma, se você tem uma List<int>, você pode chamar AdicionarVarios<int> e passar um array de inteiros.
Por exemplo:
List<string> minhaLista = new List<string>();
minhaLista.AdicionarVarios("Olá", "Mundo");
List<int> minhaListaInt = new List<int>();
minhaListaInt.AdicionarVarios(1, 2, 3, 4);
Nesses exemplos, o método AdicionarVarios<T> é chamado com T sendo string no primeiro caso e int no segundo. O importante é que os tipos de T e os argumentos passados para o método são consistentes.
Portanto, não é esquisito nem bagunçado. É uma maneira flexível de escrever métodos que podem operar em muitos tipos diferentes de dados.
Espero ter ajudado e bons estudos!