ToString() метод Object, как так происходит что ToString() знает о дочернем классе и выводит его имя? и даже если я его привожу к object поведение не меняется?
public class TEST
{
}
Console.WriteLine(test.ToString()); //TEST.Program+TEST
Console.WriteLine((object)test.ToString()); //TEST.Program+TEST
Читай про наследование, полиморфизм, и как работает модификатор virtual.
Если коротко - когда ты приводишь свой объект к базовому - рантайм всё равно знает, где находится реализация метода ToString благодаря тому, что в твоём объекте хранится указатель на реализацию этого метода.