Would someone like to specify exactly what preheat would do? Bearing in mind that we have single nozzle, single head dual nozzle, IDEX and mixing extruder configurations.
Step through the gcode file to find the first temperatures that are waited for and set them. Would likely need to go through the simulation routines to determine the active/standby temperatures needed for specific tools (and which tools are active) once any 'wait' type command is encountered.
In my opinion, it should stop at the FIRST command that causes a wait and preheat based on the values set at that point. So, if the gcode file sets only the bed temp and waits for it, then ONLY the bed temperature would be preheated. (In that case, it'd probably be a good idea to set tools to standby temps without waiting before waiting on the bed temp - this causing the tools to be preheated to standby at the same time as the bed is preheated.)
Here's some examples off the top of my head:
G10 (with R/S parameters) followed by M116
M104 followed by M116
M109
M140 followed byM116
M141 followed by M141
M190
M191
NOTE: preheated stuff will cause a bug to be hit that I've reported elsewhere concerning M116 commands being ignored.