I have three objects: Account, Contact, and a custom object called Order that belongs to Accounts (via a lookup). I want to create a report that allows me to show all Contacts that belong to an Account where the Order Status=x. Joined reports lets me do some of this, but the limit is 2000 and i can't export details, so that's useless for adding contacts to a campaign. I've tried Custom Report Types but when I set Contacts as the primary object with Accounts as the B and Orders as the C, it only shows me Contacts in the object list in the report. Can anyone help?
I recommend you take a look at the Creating Reports section of Force.com Fundamentals. Sounds like you need to be doing some cross-filtering and possibly using a Matrix report, either that or limiting the Account ranges & splitting the report into several smaller ones in order to reduce the number of records if you're hitting a limit; especially if your real purpose is to export contacts to a campaign.
Using a Cross Filter in a report can help you with what you are looking to accomplish. You want to use an Account & Contacts report type and an Account with Orders Filter. This should give you a bit more guidance: https://help.salesforce.com/HTViewHelpDoc?id=reports_cross_filters_create.htm&language=en_US