1. You can add compensate activity to the exception handler or compensation handler or faulthandler of the activity enclosing the CompensatableTransactionScope activity. In other words, if you want to use CompensateActivity, you can compensate only the immediate child activity which implements ICompensatableActivity interface. Compensation can be triggered in 3 ways.
Explicit Compensation: This is done using the CompensateActivity as mentioned above
Implicit or Default compensation: This can be done without using a Compensate activity. The compensation code of any nested successfully completed compensatable activities is run automatically if there is an unhandled exception in the workflow. This means you cannot handle the exception and your workflow terminate.
Self Compensation: In CompensateActivity, set TargetActivityName to point to the activity which is containing the CompensateActivity. This will trigger compensation on all the nested activities.
SDK docs have some good information about all this.
2. You cannot nest activities which support transactions
3. Everytime a transaction activity executes, we create a new transaction and it commits after the activity completes successfully. So you cannot really synchronize different transactions. One way will be use one TransactionScope activity and add all your custom activities which need to do transactional work to that activity.