Changing the type of an object inside a method?
It stead of having a static method the basically does what polymorphism could do for you use polymorphism.

public class Person
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    public virtual void InitializeFromDictionary(Dictionary&lt;string, string&gt; row)
    {
        FirstName = row["FirstName"];
        LastName = row["LastName"];
    }
}

public class Patient : Person
{
    public string PatientID { get; private set; }
    public override void InitializeFromDictionary(Dictionary&lt;string, string&gt; row)
    {
       base.InitializeFromDictionary(row)
       PatientID = row["PatientID"];
    }
}


and then where ever you call

BuildUpPersonOrPatient(p,row);


do this instead

p.InitialieFromDictionary(row);


I've added an access modifier to the setters because unless you have a reason to be able to change those fields from outside the object you should encapsulate the possibility of chaning the state of an object. (It's surprising how seldom you have a modeling reason for that and not just a "for conviniece" reason)