So, IItemPropertyGetter gives you the following (client side) method:
public float apply(ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entityIn)
Which includes the ItemStack, and presumably its NBT tags. It must return a single floating point number, which is tied to a single "property name" (e.g. "Time" which is what the clock uses). The Item's json file then must have these states in sequential order because minecraft goes "Ok, I need 12.9845" and starts at the top and looks for the first value that's larger than the IItemPropertyGetter's returned value and uses that "variant." I discovered this by accident when trying to do something weird.
You can see an example implementation of my own here (using world information, not NBT):
https://github.com/Draco18s/ReasonableRealism/blob/master/src/main/java/com/draco18s/farming/item/ItemThermometer.java#L53
https://github.com/Draco18s/ReasonableRealism/blob/master/src/main/resources/assets/harderfarming/models/item/thermometer.json
Where each one of those specified models is a normal, standard, item model file (which can point to a block, just like any other block item model file).
https://github.com/Draco18s/ReasonableRealism/blob/master/src/main/resources/assets/harderfarming/models/item/temp_05.json