The documentation for the reflection subsystem says that you cannot rely on the order in which the elements are returned.
That said, it has always been my experience that elements are returned in order of declaration in the source file. This may or may not be true on Mono or on future revisions of .NET.
Your best option, should you wish to proceed in spite of the above, is to use the BindingFlags.DeclaredOnly
option and manually traverse the inheritance hierarchy (scanning base types before subtypes to get them in the right order). You should write your code in such a way that the ordering of properties from a single declared type does not matter (such as, sorting them by name); this will make your code more robust, should the behavior of the .NET framework ever change.
Fasterflect does this (mostly in order to be able to filter out virtual properties that have been overridden). It also has helpers to obtain the properties, filtered or not, using it's own and more powerful Flags
selector parameter.
If ordering of the elements within a single type is not important, you could get the list (using Fasterflect) like this:
var properties = type.Properties().Reverse().ToList();
You should be aware that overridden properties will be included multiple times when reflecting this way (by traversing and only getting the declared properties). Fasterflect offers options to filter these from the result:
var properties = type.Properties( Flags.InstancePublic | Flags.ExcludeBackingMembers ).Reverse().ToList();
If you don't wish to take a dependency on the library, the code is open source, so you could pick the bits you need. The traversal algorithm can be seen here (line 443).