Creamos nuestra clase de Paginación

namespace Api.Core.Custom
{
    public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; set; }
        public int TotalPages { get; private set; }
        public int PageSize { get; set; }
        public int TotalCount { get; set; }

        public bool HasPreviousPage{
            get{
                return (PageIndex > 1);
            }
        }
        public bool HasNextPage{
            get{
                return (PageIndex < TotalPages);
            }
        }

        public int? NextPageNumber => HasNextPage ? PageIndex + 1 : (int?)null;
        public int? PreviousPageNumber => HasPreviousPage ? PageIndex - 1 : (int?)null;

        public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
        {
            TotalCount = count; //Total de Registros
            PageIndex = pageIndex; //Pagina actual en la que estamos
            PageSize = pageSize; //Total de registros por Pagina
            TotalPages = (int)Math.Ceiling(count / (double)pageSize); //Total de paginas

            this.AddRange(items);
        }

        public static PaginatedList<T> Create(IEnumerable<T> source, int pageIndex, int pageSize)
        {
            var count = source.Count();
            var items = source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

            return new PaginatedList<T>(items, count, pageIndex, pageSize);
        }
    }
}
namespace Api.Core.Custom
{
    public class Metadata
    {

        public int TotalCount { get; set; } //Total de registros
        public int PageIndex { get; set; } //Pagina Actual
        public int PageSize { get; set; } //Numero de registros por Pagina
        public int TotalPages { get; set; } //Total de paginas (TotalCount/PageSize)
        public bool HasPreviousPage { get; set; } //True = Si existe pagina anterior
        public bool HasNextPage { get; set; } //False = Si existe pagina siguiente


    }
}
namespace Api.Core.Response
{
    public class ApiResponseSuccess<T>
    {
        public ApiResponseSuccess(T success)
        {
            Success = success;
        }
        public T Success { get; set; }
        public Metadata Pagination { get; set; }

    }
}

En el Service

        public async Task<PaginatedList<MesaDto>> GetAll(FiltersQuery filters)
        {
            
            var responseModel = await _mesaRepository.GetAll();

            if (filters.Descripcion != null)
            {
                responseModel = responseModel.Where(x => x.Descripcion.ToLower().Contains(filters.Descripcion.ToLower()));
            }

            var responseDto = _mapper.Map<IEnumerable<MesaDto>>(responseModel); //Mappeamos de MesaModel a MesaDto
            var paginatedResponse = PaginatedList<MesaDto>.Create(responseDto, filters.PageIndex, filters.PageSize);

            return paginatedResponse;
        }

En el Controller

        [HttpGet]
        public async Task<IActionResult> GetAll([FromQuery] FiltersQuery filters)
        {
            var response = await _mesaService.GetAll(filters);

            var metadata = new Metadata  {
                TotalCount = response.TotalCount, //Cuanto registros tengo
                PageIndex = response.PageIndex, //En que pagina actual estamos
                PageSize = response.PageSize, //Cuantos registros por pagina
                TotalPages  = response.TotalPages, //total de paginas (TotalCount/PageSize)
                HasNextPage = response.HasNextPage, //True = Si existe una pagina Siguiente
                HasPreviousPage = response.HasPreviousPage //True = Si existe una pagina anterior 
            };

            var apiResponse = new ApiResponseSuccess<IEnumerable<MesaDto>>(response)
            {
                Pagination = metadata //Agreaganmos nuestra pagination en el JsonResultado
            }; //Retornamos nuestro response

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata));

            return Ok(apiResponse);
        }