Using a 2D tile array for your world/level generation and representation will definitely simplify things. For example you could internally represent your world in a grid of tiles and take it from there :

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Tiles {
        public class Vector2 {
            public int x; public int y;
            public Vector2(int x, int y) {
                this.x = x; this.y = y;
            }
        }
    
        public enum TileType {
            None,
            Grass,
            Dirt,
            Stone,
            Water,
            Air,
        }
    
        public class Tile {
            public Vector2 position;
            public TileType tileType;
    
            public Tile(int x, int y, TileType tileType) {
                this.position = new Vector2(x, y);
                this.tileType = tileType;
            }
        }
    
        public class World {
            public Tile[,] tiles;
            public int sizeX; public int sizeY;
    
            public World(int sizeX, int sizeY) {
                this.sizeX = sizeX;
                this.sizeY = sizeY;
                int tileCount;
    
                // build the world
                tiles = new Tile[sizeX, sizeY];
    
                Random rnd = new Random();
                tileCount = Enum.GetValues(typeof(TileType)).Length;
                // construct grid of tiles
                for (int x = 0; x < sizeX; x++) {
                    for (int y = 0; y < sizeX; y++) {
                        tiles[x, y] = new Tile(x, y, (TileType)rnd.Next(tileCount));
                    }
                }
            }
        }
    
        class Program {
            static void Main(string[] args) {
                World world = new World(20, 20);
                for (int y = 0; y < world.sizeY; y++) {
                    for (int x = 0; x < world.sizeX; x++) {
                        Console.Write((int)world.tiles[x, y].tileType + " ");
                    }
                    Console.WriteLine();
                }
            }
        }
    }

Once thats set up you can then interrogate a tile in your move path to see if its walkable based on the terrain type, or if it's blocked by an child obstacle etc.