How to add revisions tab to a custom content entity and list revisions?
To support revisions, the annotation used for the entity class needs to:

Declare the revision tables
/**
  *   revision_table = &quot;node_revision&quot;,
  *   revision_data_table = &quot;node_field_revision&quot;,
  */


Tell Drupal to show the revision UI
/**
  *   show_revision_ui = TRUE,
  */


Tell Drupal which fields in the database match the revision entity fields
/**
  *   entity_keys = {
  *     &quot;id&quot; = &quot;nid&quot;,
  *     &quot;revision&quot; = &quot;vid&quot;,
  *     &quot;bundle&quot; = &quot;type&quot;,
  *     &quot;label&quot; = &quot;title&quot;,
  *     &quot;langcode&quot; = &quot;langcode&quot;,
  *     &quot;uuid&quot; = &quot;uuid&quot;,
  *     &quot;status&quot; = &quot;status&quot;,
  *     &quot;published&quot; = &quot;status&quot;,
  *     &quot;uid&quot; = &quot;uid&quot;,
  *     &quot;owner&quot; = &quot;uid&quot;,
  *   },
  *   revision_metadata_keys = {
  *     &quot;revision_user&quot; = &quot;revision_uid&quot;,
  *     &quot;revision_created&quot; = &quot;revision_timestamp&quot;,
  *     &quot;revision_log_message&quot; = &quot;revision_log&quot;
  *   },
  */


In the links section, tell Drupal which links are for the revisions
/**
  *   links = {
  *     &quot;canonical&quot; = &quot;/node/{node}&quot;,
  *     &quot;delete-form&quot; = &quot;/node/{node}/delete&quot;,
  *     &quot;delete-multiple-form&quot; = &quot;/admin/content/node/delete&quot;,
  *     &quot;edit-form&quot; = &quot;/node/{node}/edit&quot;,
  *     &quot;version-history&quot; = &quot;/node/{node}/revisions&quot;,
  *     &quot;revision&quot; = &quot;/node/{node}/revisions/{node_revision}/view&quot;,
  *     &quot;create&quot; = &quot;/node&quot;,
  *   }
  */



(I used the annotation used from the \Drupal\node\Entity\Node class to show which keys needs to be used and as example of values to assign to those keys.)
Then the module implementing the entity must define the routes used for the revision pages. The Node module does it in the node.routing.yml file, but the route_provider class (which implements EntityRouteProviderInterface) could define them too.
entity.node.version_history:
  path: '/node/{node}/revisions'
  defaults:
    _title: 'Revisions'
    _controller: '\Drupal\node\Controller\NodeController::revisionOverview'
  requirements:
    _access_node_revision: 'view'
    node: \d+
  options:
    _node_operation_route: TRUE

entity.node.revision:
  path: '/node/{node}/revisions/{node_revision}/view'
  defaults:
    _controller: '\Drupal\node\Controller\NodeController::revisionShow'
    _title_callback: '\Drupal\node\Controller\NodeController::revisionPageTitle'
  requirements:
    _access_node_revision: 'view'
    node: \d+

node.revision_revert_confirm:
  path: '/node/{node}/revisions/{node_revision}/revert'
  defaults:
    _form: '\Drupal\node\Form\NodeRevisionRevertForm'
    _title: 'Revert to earlier revision'
  requirements:
    _access_node_revision: 'update'
    node: \d+
  options:
    _node_operation_route: TRUE

node.revision_revert_translation_confirm:
  path: '/node/{node}/revisions/{node_revision}/revert/{langcode}'
  defaults:
    _form: '\Drupal\node\Form\NodeRevisionRevertTranslationForm'
    _title: 'Revert to earlier revision of a translation'
  requirements:
    _access_node_revision: 'update'
    node: \d+
  options:
    _node_operation_route: TRUE

node.revision_delete_confirm:
  path: '/node/{node}/revisions/{node_revision}/delete'
  defaults:
    _form: '\Drupal\node\Form\NodeRevisionDeleteForm'
    _title: 'Delete earlier revision'
  requirements:
    _access_node_revision: 'delete'
    node: \d+
  options:
    _node_operation_route: TRUE

The entity class should also extend EditorialContentEntityBase, a base entity class with extended revision and publishing support. Using it, adding the revision and publishing fields is simple as adding $fields = parent::baseFieldDefinitions($entity_type); to the baseFieldDefinitions() method of the entity class.