Using LINQ or Lambda instead of nested and multiple foreach statements
By using an IEqualityComparer&lt;Person&gt; which only compares the Value property like  

public class PersonValueComparer : IEqualityComparer&lt;Person&gt;
{
    public bool Equals(Person x, Person y)
    {
        if (x == null &amp;&amp; y == null) { return true; }
        if (x == null || y == null) { return false; }

        return x.Value == y.Value;
    }

    public int GetHashCode(Person obj)
    {
        if (obj == null || obj.Value == null) {return 0;}
        return obj.Value.GetHashCode();
    }
}  


you can by using linq methods replace the loops by  

        PersonValueComparer valueComparer = new PersonValueComparer();
        initialList = secondList.Where(p =&gt; initialList.Contains(p, valueComparer))
            .Concat(initialList.Where(p =&gt; !secondList.Contains(p, valueComparer))).ToList();


We are first using the Where() method to filter the secondList for items which are in the initialList . Then we use Concat() to add the Person''s which are not in thesecondList`.  



Based on the naming guidelines properties should be named using PascalCase casing.  



You should always use meaningful and descriptive names for naming methods, variables, properties and classes so Sam the Maintainer sees at first glance what it is about.  



Shortening variable names doesn't add any value but instead reduces readability which Sam the Maintainer doesn't like.