OK, I finally gave up on just using Width.Autosize with actual Widths set small, since it was never going to ensure that column headings weren't truncated.
I already had some code I was using for another purpose to use Windows API functions to determine the size in points of a given piece of text at a given font face and point size, and used that to measure both the header text, and all of the retrieved text in the DataWindow, and set the column widths based on the larger of the two of those, plus 50 thousands of an inch (the units I'm using) for a bit of space between columns.
I also applied the same code for non-grid displays of the same data (the user has a choice in my program) to get it very nicely spaced out. And in that case, I also added an extra 50 thousandths to the starting X position of any field following a right-justified numeric field, so if that next field was left-justified, their text wouldn't be touching (as they had been without that).
So this solution doesn't use Width.AutoSize at all. (The only way to get the same effect in non-grid reports was by the measuring I did of all of the data, so I figured I might as well just do the same thing for grid reports.)
I'm very satisfied with the results now - fields that tended to be too wide are now narrow enough, and some fields that PB was sizing to be too small for the data itself are now wide enough. (The latter happened when there were a lot of capital letters in the data.)