Heat the oven to 350°F (177°C). Grease three 9-inch round cake pans, place parchment rounds in the bases, and lightly grease the parchment as well so the layers release cleanly after baking.
In a medium bowl, whisk together the cake flour, baking powder, baking soda, and salt. Set the dry mixture aside.
In a large mixing bowl, beat the softened butter with the granulated sugar on medium-high speed for about 2 minutes, until the mixture is pale and creamy. Scrape down the bowl as needed.
Add the egg whites and beat just until incorporated. Mix in the sour cream, vanilla essence, and coconut flavoring. The batter may look slightly curdled at this stage, which is normal.
With the mixer on low speed, add the dry ingredients and the coconut milk gradually, alternating as needed, and mix until combined. Fold in the shredded coconut by hand, making sure the batter is evenly blended and no pockets of butter remain. The finished batter should be somewhat thick.
Divide the batter evenly among the prepared pans. Bake for 21 to 23 minutes, or until a toothpick inserted into the center comes out clean.
Leave the cake layers in their pans to cool completely on a wire rack. Do not frost the cake until all layers are fully cooled.
To make the frosting, beat the butter and cream cheese together on medium speed for about 2 minutes, until smooth and creamy.
Add the sifted powdered sugar, coconut milk, vanilla essence, coconut flavoring, and salt with the mixer on low speed. Once incorporated, increase to high speed and beat for 3 minutes, until light and spreadable.
Adjust the frosting only if needed. Add a little more powdered sugar if it seems too soft, or a small amount of coconut milk if it feels too firm. Taste and add a tiny extra pinch of salt if the sweetness needs balancing.
If the cake layers have domed tops, level them carefully with a large serrated knife to create flat surfaces for stacking.
Place the first cake layer on a serving plate or cake stand and spread about 1 1/2 cups of frosting over the top. Set the second layer over it and repeat with another layer of frosting. Add the final cake layer, then spread the remaining frosting over the top and sides of the cake.
Scatter the toasted shredded coconut over the top and gently press additional coconut onto the sides so it adheres to the frosting.
Refrigerate the finished cake for at least 20 minutes before slicing. This resting time helps the layers hold their shape neatly when served.