TestClass tc = new TestClass { FirstName = "Jimmy" };
является синтаксическим сахаром для
TestClass tc = new TestClass();
tc.FirstName = "Jimmy";
и, следовательно, ожидаемый результат - это то, что вы наблюдаете - свойства назначаются после выполнения конструктора.
Инварианты объекта должны быть установлены конструктором и не должны нарушаться в течение срока службы объекта (или более практичные нарушения инварианта должны быть кратковременными и невидимыми для внешнего мира) Поэтому вам действительно следует передать имя в качестве параметра конструктора, если это важно для установления инвариантов объекта.
По моему мнению, инициализаторы полей сильно перегружены. Всегда имейте в виду, что вы можете заставить вызывающую сторону предоставлять аргументы конструктора, но не устанавливать некоторые свойства после создания нового экземпляра.