My first solution (before the buildings in my game had multiple floors) was to take the ISO mouse position, grab a list of items within a cone spreading towards the screen, then:
1.) Loop through each item
2.) Create a sprite of the item (so I have direct access to RGBA info)
3.) Convert mouse coords to sprite coords
4.) Check if I'm hitting a pixel (i.e. alpha > 0)
5.) Keep track of this item
6.) Update if an item closer to the bottom of the screen (i.e. closer to camera) gets a hit
Once I added building height, this became impractical (too many items to loop through, sprite creation is CPU intensive).
New solution is to assign a 24 byte UUID to each item, convert that to RGB, draw it to the screen (invisible to the user), and then return a tiny texture every frame from the GPU at the mouse position. If the color in the texture is not black, then convert RGB back into the UUID.
PS: If you know how to draw so that alpha replaces existing alpha (instead of blending), please let me know so I can have 32 byte UUIDs!
[1] Source: I'm developing Metropolis 1998 https://store.steampowered.com/app/2287430/Metropolis_1998/