ContentControl is a base class for controls that contain other elements and have a "Content" property (for example, Button).
ContentPresenter is used inside control templates to display content.
ContentControl, when used directly (it's supposed to be used as a base class), has a control template that uses ContentPresenter to display it's content.
EDIT: My rules of thumb (not applicable in every case, use your judgment):
- Inside ControlTemplate use ContentPresenter
- Outside of ControlTemplate (including DataTemplate and outside templates) try not to use any of them, if you must prefer ContentPresenter
- Subclass ContentControl if you are creating a custom "lookless" control that host content and you can't get the same result by changing an existing control's template (that should be extremely rare).