The standard 'Opportunity with Contact Roles' report type indeed only contains a limited set of fields.
But, you can create your own custom report type. (you might want to read up on that first)
- Go to setup->Report Types and click 'New Custom Report Type'
- Select the 'Opportunity' as your Primary Object and fill in all other values with whatever is appropriate. Don't forget to select status 'Deployed' or you won't be able to use the report type
- click 'Click to relate another object'
- Select the 'Contact Roles' and Save
The new report type will be default contain all the fields on both objects.
The reason that this is not available be default is simply that Salesforce wants to help you prevent creating inefficient reports.
Turns out Salesforce still show the Contact-level fields on the report, even if you select ContactRole level fields. I checked the report metadata for that scenario and it shows the right field on the metadata, i.e. Opportunity.OpportunityContactRoles$LastModifiedDate . But that must resolve to the Contact-level field then internally, because of the many-to-many relationship.
Anyway, the workaround would be to create formula fields on OpportunityContactRole. E.g. a Date or DateTime formula field that contains the LastModifiedDate of the OpportunityContactRole. Then include that in your custom report types and then on your report and it will show the right date on the report (I tested this and it works correctly).