How add custom AcessResult reason?
As per function definition:

   /**
    * Creates an AccessResultInterface object with isForbidden() === TRUE.
    *
    * @param string|null $reason
    *   (optional) The reason why access is forbidden. Intended for developers,
    *   hence not translatable.
    *
    * @return \Drupal\Core\Access\AccessResultForbidden
    *   isForbidden() will be TRUE.
    */
   public static function forbidden($reason = NULL) {
     assert('is_string($reason) || is_null($reason)');
     return new AccessResultForbidden($reason);
   }


So the $reason is only intended for developers.