You are doing this:
SetColumnWidth( i, LVSCW_AUTOSIZE_USEHEADER );
According to MSDN
LVSCW_AUTOSIZE_USEHEADER: Automatically sizes the column to fit the header text.
You need to go through each column, find the longest string:
CSize sz;
for (/*for each column, go through each row*/)
{
sz = pDC->GetTextExtent(str); // get string size for each row
if (sz.cx > dx)
dx = sz.cx;
}
Then
// Set the column width to the largest string.
SetColumnWidth(dx);