A grid is a graph in disguise. Each cell is a node. Two cells are neighbors if they are adjacent: up, down, left, right, or diagonals (depending on the problem). You do not need an explicit adjacency list. When processing cell , check all surrounding cells.
Skip cells that are out of bounds or blocked. Add valid cells to the queue. This implicit graph representation is common in grid problems. BFS on a grid works the same as BFS on any graph, but the neighbors are calculated on the fly instead of stored in advance.