Следующее должно работать. Он также тянет значок для других типов файлов (например, белый лист бумаги для .txt), хотя он не будет извлекать встроенные миниатюры (так как они добавляются расширениями оболочки).
icon = Icon.ExtractAssociatedIcon(filename);