The private string is a backing field that is set when you do FirstName = "...." in your code. Effectively what happens is that this code translates into a hidden set call (that's what the compiler does under the surface). The pseudo-logic looks like this:
public void FirstName_Set(string value)
{
_firstName = value;
}
By doing this, we ensure that _firstName is hidden from outside classes (we encapsulate it). Of course, if all you are doing is setting a simple value and you aren't doing anything like serialization or more complex forms of validation, then you might as well just have
public string FirstName;