CSV reader in Windows Forms
if (HasHeaderRow)
        {



It seems strange, that you know in advance, if the file has headers or not? If that is right, why then call the method in the first place if HasHeaderRow is false - when you do nothing in that case?




  public List&lt;(string IPN, string FPTech)&gt; GetIPNFPTechFromCSV(string filePath)



I would return IEnumerable&lt;..&gt; instead and then use yield return to return each data pair (see below).
I would define a struct or class instead of using a named tuple. IMO named tuples are only useful very locally, because they can be harder to maintain, if their definition changes and you distribute them across the application (see below).





  var IPNFPTechPair = (IPN: line.Split(Delimiter)[IPNPos], FPTech: line.Split(Delimiter)[FPPos]);



Here you split the same string twice. It would be better to do:

string[] cells = line.Split(Delimiter);
var IPNFPTechPair = (IPN: cells[IPNPos], FPTech: cells[FPPos]);




You should handle all the heading stuff in a separate method in order to make the design and responsibility more clear.



All in all I would do something like:

public IEnumerable&lt;IpnItem&gt; Read(string filePath)
{
  using (StreamReader reader = new StreamReader(filePath))
  {
    (int ipnColumn, int fptechColumn) = ReadHeaders(reader);

    string line;
    while ((line = reader.ReadLine()) != null)
    {
      string[] cells = line.Split(Delimiter);
      yield return new IpnItem(cells[ipnColumn], cells[fptechColumn]);
    }
  }
}

private (int ipnColumn, int fptechColumn) ReadHeaders(StreamReader reader)
{
  string[] headers = reader.ReadLine().Split(Delimiter);
  if (headers.Length != 2) throw new Exception("Number of column headers should be 2");
  (int ipnColumn, int fptechColumn) columnIndices = (Array.IndexOf(headers, "PartNumber"), Array.IndexOf(headers, "FPTech"));
  if (columnIndices.ipnColumn == -1 || columnIndices.fptechColumn == -1) throw new Exception("Invalid or missing column names");
  return columnIndices;
}


Where IpnItem is declared as:

  public class IpnItem
  {
    public IpnItem(string ipn, string fpTech)
    {
      IPN = ipn;
      FPTech = fpTech;
    }

    public string IPN { get; private set; }
    public string FPTech { get; private set; }
  }