It appears that you're adding the same 'det' object to the list each time you read a new record.
I'd try moving this line:
DetailRecord det = new DetailRecord();
within the while loop so you create a new object for each read:
while (dr.Read())
{
if (recnt == 0)
{
for (int fcnt = 0; fcnt < dr.FieldCount; fcnt++)
{
header.Add(dr.GetName(fcnt));
}
GenXML.AddWS_Headerdata(out ws1, out sd1, header); //Write header row
}
DetailRecord det = new DetailRecord();
det.PHARMACY_CLAIM_NBR = dr["PHARMACY_CLAIM_NBR"].ToString();
Output_Files.PrintLog("IN=" + det.PHARMACY_CLAIM_NBR);
holdRow.Add(det);
recnt++;
}