После поиска в теме я нашел несколько «магических чисел» и пришел к следующему решению (обработчик события TOpenDialog.OnFolderChange):
procedure TDM.OpenDlgFolderChange(Sender: TObject);
const
FCIDM_SHVIEW_LARGEICON = $7029;
FCIDM_SHVIEW_SMALLICON = $702A;
FCIDM_SHVIEW_LIST = $702B;
FCIDM_SHVIEW_REPORT = $702C;
FCIDM_SHVIEW_THUMBNAIL = $702D;
FCIDM_SHVIEW_TILE = $702E;
ByName = $7602;
BySize = $7603;
ByType = $7604;
ByModified = $7605;
ByAttributes = $7608;
var
Handle: THandle;
begin
Handle:= FindWindowEx(GetParent(OpenDlg.Handle), 0, 'SHELLDLL_DefView', nil);
SendMessage(Handle, WM_COMMAND, FCIDM_SHVIEW_REPORT, 0);
SendMessage(Handle, WM_COMMAND, ByAttributes, 0);
SendMessage(Handle, WM_COMMAND, ByName, 0);
end;
Первое сообщение устанавливает режим просмотра «Детали», второе устанавливает сортировку «По атрибутам» и третье - «По имени»; два разных сообщения «сортировки» необходимы, чтобы гарантировать, что окончательная сортировка возрастает.
Приведенный выше код отлично работает на Win XP, но часть сортировки не работает на Win 2000 SP4; в Win 7 смещаются "магические числа сортировки", то есть "ByName = $ 7603" и т. д.