Great stuff
In order to have the size fully dynamic depending on the DPI, I suggest that the Width / Height of the image list be interpreted relative to a ReferenceDPI property with default value 96. Then the size in pixels for a certain surface will be Round(Width / ReferenceDPI * TargetDPI) and similarly vertically.
Following this principle, the Draw function with only x and y parameters would be replaced by a function with x and y parameters and a target DPI. Alternatively, we can have a Draw function with x and y and a target control or provide a function that computes the DPI. Indeed, the target DPI can be computed from the PixelsPerInch and GetCanvasScaleFactor.
To let the controls know what is the resulting size, it would be handy to have a function GetSizeOnSurface(ATargetDPI: integer): TSize. So the controls that use the image list can determine the layout to place the image.
What do you think?