The latest product family ("Infinity") uses a home-grown XML-based metadata programming framework. While this might sound interesting, it is actually tedious and difficult. For example, to pass a parameter to a dialog constructor, you can't just change the constructor signature and the call statements. The Infinity framework calls the constructor, so the constructor definition is completely beyond your control. Instead you have to add a dictionary item to an "ExtraValues" property, and in some custom code you have to define a method overload where you find the ExtraValues array, then search the dictionary to find your string-expressed parameter, then convert it to the right data type. Programming in Infinity is filled with such instances of going around your elbow to get to your nose.
In practice all the business logic ends up in a relational database and its stored procs/functions. The SQL language is good for expressing set logic, but it is rather clumsy for most domain functionality, business rules, and application flow. So the resulting product handles small modifications with ease (e.g., adding a custom field) and but is rather difficult to change in more significant ways.
Since Blackbaud does encourage improvements (see my "best reasons" above), various folks are making small contributions that incrementally improve the experience of programming software on the Infinity platform. I expect the experience to continue to improve as time goes on.