While this is an old question, I came across it just now while looking into CListCtrl column dragging and thought I'd update it a bit in case it's of use to somebody else.
The OP mentioned that,
HDITEM columnStruct;
List->GetHeaderCtrl()->GetItem(phdr->iItem, &columnStruct); // but this call just fills columnStruct with junk values
This will because you haven't initialised columnStruct enough to tell GetItem what data you're interested in retrieving. You need to initialise columnStruct.mask with various flags such as HDI_WIDTH | HDI_ORDER, and if you use HDI_TEXT then give columnStruct.pszText a buffer and columnStruct.cchTextMax the size of the buffer.
This is documented in the CHeaderCtrl::GetItem documentation on MSDN for example.
Any flags set in the mask element ensure that values in the corresponding elements are properly filled in upon return. If the mask element is set to zero, values in the other structure elements are meaningless.