I think you are using a tilemap?
For a single tile (a scene you create yourself), it's simple to have collisions.
However, in Tilemap, the tiles aren't scenes you created. They are from what is called the "Tileset".
But that's okay. Still, create a scene for a tile and save it. Then attach a script to the Tilemap, iterating every tiles, and instance the tile scene you just created, set its position to where the iterated tile is. After that, free the tilemap (Remove it from the scene). The "tiles" in the Tilemap here are just representation of your tiles, so the idea is to iterate these "fake" tiles and instance the "real" tile that is the tile you saved as a scene.
This way, you can customize your tiles by designing your own tile scenes (including the adding of CollisionShape)
Edit: Remember by saying iterating I mean using a for loop in the script attached to TileMap. The tile scene you created is only one, every tile instanced from the TileMap is an instance of the scene you created.
To mkae a difference in properties between different tiles(Like having collisions or not), you can try to create a variable "id" for control. "id" there to represents each tile.
Further info for how to use "id" to control your tiles: each id can be used to represent a "fake" tile from the Tileset. When instancing, pass the id to the instanced scene("real" tile) and init it according to what id is passed. Creating a function
init_by_id(id) if you want, though using
_ready() is fine.
Back to the question again. Your need to know which specific tile is being collided, and if you want, for more, what events you want to trigger (Just like triggers), can be done in the designing the tile scene.