Browsing through MSDN a bit more, I find this in Type.GetProperty:
===> Situations in which AmbiguousMatchException occurs include the following:
* A type contains two indexed properties that have the same name but different numbers of parameters. To resolve the ambiguity, use an overload of the GetProperty method that specifies parameter types. * A derived type declares a property that hides an inherited property with the same name, by using the new modifier (Shadows in Visual Basic). To resolve the ambiguity, use the GetProperty(String, BindingFlags) method overload and include BindingFlags..::.DeclaredOnly to restrict the search to members that are not inherited. ===>
The last situation is what we have ('new' being used because the return-value is more specific), and it appears specifying the return type is then unneccessary. This works:
(INVOKE (INVOKE TLP "GetType") "GetProperty" "Controls" (OR-ENUMS (FIELD "BindingFlags" "Instance") (FIELD "BindingFlags" "Public") (FIELD "BindingFlags" "DeclaredOnly")))
perhaps adding this flag in an exception-handler for this case would be ok, as the first kind of ambiguity should not be possible as all parameter types are passed. Otherwise, one would need to either add the return-type somehow or write a specialized Binder-subclass.
It's kind of strange that this seems to only affect properties; for instance both get_Controls methods were present, but the default GetMethod-method had no problem with that.