Consider the following code.
Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperti
The TypeDescriptor class returns PropertyDescriptor objects that represent the properties in the type of obj as well as any other properties that were contributed to the object itself or to its type.
The component model is actually quite complex, but as you describe, the basic implementation of TypeDescriptor.GetProperties() will return ReflectPropertyDescriptor instances that represent an indirection to typical PropertyInfo objects. You can use PropertyDescriptor objects very much like PropertyInfo objects: they can be used to get and set the value of the property and they have attributes.
For DependencyObject instances in WPF, TypeDescriptor.GetProperties() also returns attached properties. These PropertyDescriptor objects in this case provide an indirection to the dependency object model rather than to reflection.
In the component designer, it is possible to use ICustomTypeDescriptor or TypeDescriptionProviderAttribute (and maybe some other techniques) to create your own PropertyDescriptor objects at runtime or at designtime. In any case, it is possible that the properties returned from Type.GetProperties() may very well differ from those returned from TypeDescriptor, depending on the context.