se non ho capito male i padri non possono essere figli a loro volta, se è cosi le cose si semplificano parecchio.
La tua struttura dati è una lista di oggetti persona che sono i padri che oltre ai connotati ha anche una proprieta elenco figli List<Persona>.

codice:
public class Persona {
  public int ID {get;set;}
  public string Nome {get;set;}
  //altre props
  public List<Persona> Figli {get;set}

  public Persona()
  {
    Figli = new List<Persona>();
  }
}
codice:
public List<Persona> GeneraAlbero()
{
  public List<Persona> albero = new List<Persona>();

  //Seleziona dal DB tutti i padri (quelli con id=0)
  //Aggiungi i padri alla lista albero
  foreach(Persona padre in albero)
  {
      // seleziona tutte le persone dal db che hanno come idPadre l'id di padre
      //Aggiungi i figli selezionati alla lista padre.Figli
  }

  return albero;
}
Se invece i padri possono a loro volta essere figli la funzione generaAlbero la devi fare ricorsiva, gli devi passare l'id del padre (0 quando la chiami per la prima volta) e poi richiamarla dentro il foreach.