How to build a precise voltage controlled resistive heater?
You may choose a thyristor gating on every zero crossing of AC. So there will be no voltage change other than 0% vs 100%. As thermall inertia is longer than 15-20 ms. for every practical mass, the PID algorythm simply has to calculate a floating number between 0..1.000. Translate the number into decision to open gate or not on next zero crossing and execute decision. The history of opening must be held in memory for last 1000..10000 periods to keep averaging math.

TLDR: simply look at circuits with zero crossing, opto-insulated thyristors and choose the resolution of output in terms of "openings per 1000 cycles".

Other note: do not try to use exceedingly high resolution, because feedback resolution is always higher than output resolution by factor of speeds ratios. Say if latency of T sensor together with algorithm latency is 20 ms and latency of thermal mass is 200 seconds, then your resolution for ideal PID will be 10K better than 100% resolution of output (switch on/off). So at the end your system will have "following error or position error" of 100%/10K=0.01%, or for range of say 0C-100C it will be 0.01C degree.