Parsing CSV to specific format
Few comments:


Make your code more abstract, use IEnumerable instead of List

 public interface ICsvReader
 {
    IEnumerable&lt;Contact&gt; ParseCsv(string filePath);
 }

Provide an asynchronous version

public interface ICsvReader
{
    IEnumerable&lt;Contact&gt; ParseCsv(string filePath);
    Task&lt;IEnumerable&lt;Contact&gt;&gt; ParseCsvAsync(string filePath);
}

Use StreamReader instead of File.ReadAllLines, it has an async version that you can use in your ParseCsvAsync method

using(var stream = new StreamReader(filePath)){
 // read all lines
}

Try to use the var keyword for local variables, it makes refactoring easier

var rows = GetRows(filePath);

Use the beauty of deferred execution in C#

private IEnumerable&lt;Contact&gt; MakeContacts(string[] headers, List&lt;string[]&gt; rows)
{
    for (int i = 1; i &lt; rows.Count; i++)
    {
        string[] row = rows[i];
        Contact contact = new Contact();
        for (int e = 0; e &lt; row.Length; e++)
        {
            string header = headers[e];
            string value  = row[e];

            contact = MatchHeader(contact, header, value);
        }
        yield return contact;
     }
}

You can convert ToList immediately without calling ToArray

  private IEnumerable&lt;List&lt;string&gt;&gt; GetRows(string filePath)
  {
    // why you creating this List here???
    List&lt;Contact&gt; users = new List&lt;Contact&gt;();
    lines = File.ReadAllLines(filePath);
    var csv = (from line in lines
              select line.Split(',')).ToList();

    return csv;
  }

Consider @Snowbody suggestions about using a Dictionary instead of a massive switch.