In your EntityPlaceEvent, you would manually place the blocks for your structure based on the placed block position. Such as world.setBlockAndUpdate(pos, Blocks.WHATEVER_BLOCK.defaultBlockState());. pos being the position you want to set the block. You would call this for as many blocks as you need until your structure is complete.
You have two options. You could manually create the structure by placing blocks individually based on the location of the player-placed block (Yes using x, y, z coordinates). Or you could load the structure using an nbt structure file based on the location of the player-placed block. I suppose it mostly depends on how large and complex the structure is. If it is fairly complex or large, Id go with the second option.