Some codes are set only after a fault is detected in two consecutive drive cycles, and then only if other criteria are also met. A symptom that shows up only in 1 in 10 cold start-ups, and might not be repeatable within a single drive cycle, might also not meet the requirement to set the CEL. Other codes, such as misfires, will flash the CEL at the time and ultimately set the CEL in a single drive.
I believe your active OBD is part of the Torque or Torque Pro app. That should be able to read OBD engine codes. Sometimes, if a fault is detected in a drive cycle, the ECM will not turn on the CEL at that time (as noted above), but might save a "pending" code for that fault. Some OBD code readers will show "pending" codes. If you haven't already tried it, next time the car is exhibiting the hesitation, check to see if the app shows any pending codes at that time. (If there are any codes, do not use the app to clear any codes that are identified.)
Hesitation etc could be almost anything related to engine operation -- fuel, air, spark.
Incidentally, I've attached a table showing the range of data (parameters) that the ECM can provide to OBD scanners. Your app might be able to readout many of these. The table is based on an engine that's fully warmed up and idling, so the values indicated wouldn't apply to when your symptoms appear, but even then some faults can show up in the data when the engine isn't yet at it's normal operating temperature. So perhaps monitoring the data when the symptoms don't appear could provide a reference for when they do.
Also, I wonder if the LPG flexibility might be a factor. I understand it is prevented from switching to LPG when the engine isn't warmed up, but is that determined by the status of the light, or is it based on the actual coolant temperature? is the switch to LPG automatic, or manual, and if automatic, how do you know when the system switches over?