Это потому, что вы рекурсивно вызываете свойство - в set
вы снова устанавливаете свойство, которое продолжается до бесконечности до тех пор, пока вы не сбросите стек.
Вам необходимо личное поле для хранения значения, например,
private string firstName;
public string FirstName
{
get
{
return this.firstName;
}
set
{
this.firstName = value;
}
}
В качестве альтернативы, если вы используете C # 3.0, вы можете использовать авто-свойство, которое создает для вас скрытое поле поддержки, например,
public string FirstName { get; set; }