Добавь отображение истории которая хранится в history_board на страницу приложения History.
Вот код который у меня есть
1 файл:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TicTac.History">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Welcome to Xamarin.Forms!"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

2 файл:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace TicTac
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class History : ContentPage
    {
        public History()
        {
            Title = "История игр";
            InitializeGameField();
        }
        private void InitializeGameField()
        {
            var viewModel = BindingContext as ViewM;
            if (viewModel != null)
            {
            }
        }
    }
}

3 файл:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using System.Windows.Input;
using Xamarin.Forms;

namespace TicTac
{
    public class ViewM : INotifyPropertyChanged
    {
        internal Game _game;
        public byte fieldSize { get; set; } = 3;

        public ICommand MinusSize { get; }
        public ICommand PlusSize { get; }
        public ICommand StartGame { get; }
        public ICommand MoveCommand { get; }


        public ViewM()
        {
            _game = new Game(fieldSize);

            MinusSize = new Command(DecreaseFieldSize);
            PlusSize = new Command(IncreaseFieldSize);
            StartGame = new Command(StartNewGame);
            MoveCommand = new Command<int>(Move);
        }
        public char[] board => _game.board; //получение доски из игры
        public string Xwin => _game.Xwin.ToString();
        public string Owin => _game.Owin.ToString();

        private void Move(int index)
        {
            if (_game.Move((byte)index))
            {
                OnPropertyChanged(nameof(board)); //обнновление доски
                OnPropertyChanged(nameof(Turn)); //обновление чей ход
                OnPropertyChanged(nameof(Xwin));
                OnPropertyChanged(nameof(Owin));
            }
        }

        public string Turn
        {
            get
            {
                return !_game.isWin ? (_game.Xturn ? "Ход: X" : "Ход: O") : (_game.Xturn ? "Победил X" : "Победил O"); //так как в логике игры переменная хода является булевой
            }
        }

        private void DecreaseFieldSize()
        {
            fieldSize--;
            OnPropertyChanged(nameof(fieldSize));
        }

        private void IncreaseFieldSize()
        {
            fieldSize++;
            OnPropertyChanged(nameof(fieldSize));
        }

        private void StartNewGame()
        {
            _game.Restart(fieldSize);
            OnPropertyChanged(nameof(Turn));

        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

4 файл:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml;

namespace TicTac
{
    internal class Game// : INotifyPropertyChanged
    {
        public char[] board;
        public char[][] history = { };
        public ArrayList history_board = new ArrayList();
        public bool Xturn = true;
        private byte size;
        public bool isWin = false;
        public int Xwin = 0;
        public int Owin = 0;

        public Game(byte fieldSize) {
            Restart(fieldSize);
        }
        public void Restart(byte fieldSize)
        {
            size = fieldSize;
            Xturn = true;
            isWin = false;
            board = new char[fieldSize * fieldSize];
            for (int i = 0; i < (fieldSize * fieldSize); i++)
            {
                board[i] = ' '; //заполнение поля пустотой
            }
        }

        public bool Move(byte cell) { //ход
            if (board[cell] == ' ' && !isWin) //проверка клетки на свободность
            {
                board[cell] = Xturn ? 'X' : 'O'; //занятие ячейки в зависимости от того чей ход
                Xturn = !Xturn;
                if (WinCheck())
                {
                    isWin = true;
                    Xturn = !Xturn;
                    if (Xturn) { Xwin++; } else { Owin++; };
                    history_board.Add(board);
                };
                return true;
            }
            else { return false; }
        }

        public bool WinCheck() {
            var lineRef = new char[size];
            var line = new char[size];
            for (int i = 0; i < size; i++)
            {
                lineRef[i] = !Xturn ? 'X' : 'O';
            }
            for (int row = 0; row < size; row++) //проверка строк
            {
                line = new char[size];
                for (int col = 0; col < size; col++)
                {
                    line[col] = board[row * size + col];
                    if (line.SequenceEqual(lineRef))
                    {
                        return true;
                    }
                }
            }
            for (int col = 0; col < size; col++) //проверка столбцов
            {
                line = new char[size];
                for (int row = 0; row < size; row++)
                {
                    line[row] = board[row * size + col];
                    if (line.SequenceEqual(lineRef))
                    {
                        return true;
                    }
                }
            }
            for (int i = 0; i < size; i++) //проверка \ диагонали
            {
                line[i] = board[i * (size + 1)];
                if (line.SequenceEqual(lineRef))
                {
                    return true;
                }
            }
            for (int i = 0; i < size; i++) //проверка / диагонали
            {
                line[i] = board[(i+1)*(size-1)];
                if (line.SequenceEqual(lineRef))
                {
                    return true;
                }
            }
            return false;

        }

        //public event PropertyChangedEventHandler PropertyChanged;
        //private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        //{
        //    if (PropertyChanged != null)
        //    {
        //        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        //    }
        //}
    }
}

5 файл:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace TicTac
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            Title = "TicTacToe";
            InitializeComponent();
            InitializeGameField();
        }

        private void InitializeGameField()
        {
            var viewModel = BindingContext as ViewM;
            if (viewModel != null)
            {
                field.Children.Clear();
                field.RowDefinitions.Clear();
                field.ColumnDefinitions.Clear();

                for (int row = 0; row < viewModel.fieldSize; row++)
                {
                    for (int col = 0; col < viewModel.fieldSize; col++)
                    {
                        var button = new Button();
                        int index = row * viewModel.fieldSize + col; //расёт индекса элемента так как используется одномерное поле
                        button.SetBinding(Button.TextProperty, new Binding($"board[{index}]")); //привязка текста кнопок к элементам поля
                        button.Command = viewModel.MoveCommand;
                        button.CommandParameter = index;

                        field.Children.Add(button, col, row);
                    }
                }
            }
        }

        private void ReDraw(object sender, EventArgs e) //перерисовка поля после начала игры
        {
            InitializeGameField();
        }
        private async void ToHistory(object sender, EventArgs e) {
            await Navigation.PushAsync(new History());
        }

    }
}

6 файл:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:TicTac"
             x:Class="TicTac.MainPage">

    <ContentPage.BindingContext>
        <vm:ViewM/>
    </ContentPage.BindingContext>

    <AbsoluteLayout>
        <Frame BackgroundColor="#2196F3" Padding="12" CornerRadius="0"
               AbsoluteLayout.LayoutBounds="0, 0, 1, 0.14"
               AbsoluteLayout.LayoutFlags="All"
               >
            <Button Text="История игр" FontSize="36"
                AbsoluteLayout.LayoutFlags="All"
                Clicked="ToHistory"/>
        </Frame>
        <Grid HorizontalOptions="Center"
              AbsoluteLayout.LayoutBounds="0.5, 0.15"
              AbsoluteLayout.LayoutFlags="PositionProportional">
            <Label Text="X:" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>
            <Label Text="{Binding Xwin}" FontSize="36" Grid.Column="1" HorizontalTextAlignment="Center"/>
            <Label Text="O:" FontSize="36" Grid.Column="3" HorizontalTextAlignment="Center"/>
            <Label Text="{Binding Owin}" FontSize="36" Grid.Column="4" HorizontalTextAlignment="Center"/>

        </Grid>
        <Grid HorizontalOptions="Center"
              AbsoluteLayout.LayoutBounds="0.5, 0.23"
              AbsoluteLayout.LayoutFlags="PositionProportional">
            <!--<Label Text="Turn:" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>-->
            <Label Text="{Binding Turn}" FontSize="36" Grid.Column="0" HorizontalTextAlignment="Center"/>
        </Grid>

        <Grid x:Name="field"
              AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 0.4"
              AbsoluteLayout.LayoutFlags="All">
        </Grid>

        <Grid AbsoluteLayout.LayoutBounds="0.5, 0.9, 1, 0.1"
              AbsoluteLayout.LayoutFlags="All">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="2*" />
            </Grid.ColumnDefinitions>
            <Button Text="-" Grid.Column="0"
                    Command="{Binding MinusSize}"/>
            <Label Text="{Binding fieldSize}" FontSize="42" Grid.Column="1" HorizontalTextAlignment="Center" VerticalTextAlignment="Center"/>
            <Button Text="+" Grid.Column="2"
                    Command="{Binding PlusSize}"/>
        </Grid>
        <Button Text="New game" FontSize="36"
                AbsoluteLayout.LayoutBounds="0.5, 1, 1, 0.1"
                AbsoluteLayout.LayoutFlags="All"
                Command="{Binding StartGame}"
                Clicked="ReDraw"/>
    </AbsoluteLayout>

</ContentPage>